const GitHubInfo = {
  requestAPI: (url, callback, timeout) => {
    let retryTimes = 5;
    function request() {
      return new Promise((resolve, reject) => {
        let status = 0; // 0 等待 1 完成 2 超时
        let timer = setTimeout(() => {
          if (status === 0) {
            status = 2;
            timer = null;
            reject('请求超时');
            if (retryTimes == 0) {
              timeout();
            }
          }
        }, 5000);
        fetch(url).then(function(response) {
          if (status !== 2) {
            clearTimeout(timer);
            resolve(response);
            timer = null;
            status = 1;
          }
          if (response.ok) {
            return response.json();
          }
          throw new Error('Network response was not ok.');
        }).then(function(data) {
          retryTimes = 0;
          callback(data);
        }).catch(function(error) {
          if (retryTimes > 0) {
            retryTimes -= 1;
            setTimeout(() => {
              request();
            }, 5000);
          } else {
            timeout();
          }
        });
      });
    }
    request();
  },
  layout: (cfg) => {
    const el = $(cfg.el)[0];
    function fill(data) {
      for (let key of Object.keys(data)) {
        $(el).find("[type=text]#" + key).text(data[key]);
        $(el).find("[type=link]#" + key).attr("href", data[key]);
        $(el).find("[type=img]#" + key).attr("src", data[key]);
      }
    }
    GitHubInfo.requestAPI(cfg.api, function(data) {
      const idx = el.getAttribute('index');
      if (idx != undefined) {
        const arr = data.content || data;
        if (arr && arr.length > idx) {
          let obj = arr[idx];
          obj['latest-tag-name'] = obj['name'];
          fill(arr[idx]);
        }
      } else {
        fill(data);
      }
    }, function() {
    });
  },
}

$(function () {
  const els = document.getElementsByClassName('stellar-ghinfo-api');
  for (var i = 0; i < els.length; i++) {
    const el = els[i];
    const api = el.getAttribute('api');
    if (api == null) {
      continue;
    }
    var cfg = new Object();
    cfg.el = el;
    cfg.api = api;
    cfg.class = el.getAttribute('class');
    GitHubInfo.layout(cfg);
  }
});
